#ifndef __REDIS_HPP__
#define __REDIS_HPP__
#include <hiredis/hiredis.h>
#include <pthread.h>
#include <mutex>
#include <string>
#include "../log/Logger.hpp"
using namespace std;

class RedisPool {
   private:
    static RedisPool* _pInstance;  // 单例对象的指针
    static pthread_once_t _once;   // 线程安全
    static int conn_num;
    static int* conn_flag;
    static redisContext** conn_pool;
    
    std::mutex mtx;
    std::string ip;
    int port;

    int empty_num;
    int current_conn;

    RedisPool();
    ~RedisPool();

   public:
    static void init();
    static void destroy();
    static RedisPool& getInstance();
    redisContext* get_conn(int id);
    void put_conn(int id);

    //     int init() {
    //         ip = ip_;
    //         port = port_;
    //         conn_num = conn_num_;
    //
    //         conn_pool = new redisContext*[conn_num];
    //         if (conn_pool == NULL) {
    //             return 1;
    //         }
    //
    //         conn_flag = new int[conn_num];
    //         if (conn_flag == NULL) {
    //             return 2;
    //         }
    //
    //         for (int i = 0; i < conn_num; ++i) {
    //             conn_pool[i] = redisConnect(ip.c_str(), port);
    //             if (conn_pool[i] == NULL || conn_pool[i]->err) {
    //                 return 3;
    //             }
    //
    //             conn_flag[i] = 0;
    //         }
    //
    //         empty_num = conn_num;
    //         current_conn = 0;
    //
    //         return 0;
    //     }
    //
    //     redisContext* get_conn(int& id) {
    //         if (empty_num == 0) {
    //             return NULL;
    //         }
    //
    //         mtx.lock();
    //
    //         while (conn_flag[current_conn] != 0) {
    //             current_conn = (current_conn + 1) % conn_num;
    //         }
    //
    //         conn_flag[current_conn] = 1;
    //         --empty_num;
    //         id = current_conn;
    //         current_conn = (current_conn + 1) % conn_num;
    //
    //         mtx.unlock();
    //
    //         return conn_pool[id];
    //     }

    //void put_conn(int id); 调整到上面去了
    //      {
    //         if (id < conn_num && id >= 0) {
    //             mtx.lock();
    //
    //             conn_flag[id] = 0;
    //             ++empty_num;
    //
    //             mtx.unlock();
    //         }
    //
    //         return;
    //     }
    
};

#endif